// 不会被提升
// 重复声名会报错
// 不绑定全局作用域
// 块级作用域

// 不绑定全局作用域,  注意需要再浏览器环境测试
; (function () {
    return
    var value = 1
    console.log(window.value); //1
    let value2 = 1;
    console.log(window.value2); // undefined

})();

; (function () {
    return
    for (var i = 0; i < 3; i++) {
        var i = 'abc';
        console.log(i);
    }
    // abc

})();

// 使用let时的for循环的伪代码
; (function () {
    return
    for (let i = 0; i < 3; i++) {
        let i = 'abc';
        console.log(i);
    }
    // 相当于=================================
    var funcs = [];
    for (let i = 0; i < 3; i++) {
        funcs[i] = function () {
            console.log(i);
        };
    }
    funcs[0](); // 0
    // 相当于=================================
    // 伪代码
    // (let i = 0) {
    //     funcs[0] = function () {
    //         console.log(i)
    //     };
    // }

    // (let i = 1) {
    //     funcs[1] = function () {
    //         console.log(i)
    //     };
    // }

    // (let i = 2) {
    //     funcs[2] = function () {
    //         console.log(i)
    //     };
    // };
    // 如果let换成const=================================
    // (let i = 2)==>(const i=2)
    // 因为const 变量不允许变化
})();


; (function () {
    //return
    // for (const i = 0; i < 3; i++) {
    //     i++都报错了
    //     console.log(i);
    // }


    let  funcs = [], object = { a: 1, b: 1, c: 1 };
    for (const key in object) {
        funcs.push(function () {
            console.log(key)
        });
    }

    funcs[0]()

})();